% Create Rayleigh fading channel object.
chan = rayleighchan(1/10000,100);

% Generate data and apply fading channel.
M = 2; % DBPSK modulation order
hMod = modem.dpskmod('M', M);       % Create a DPSK modulator
hDemod = modem.dpskdemod(hMod);     % Create a DPSK demodulator
                                        % using the modulator
tx = randi([0 M-1],50000,1);        % Generate a random bit stream
dpskSig = modulate(hMod, tx);       % DPSK modulate the signal
fadedSig = filter(chan,dpskSig);    % Apply the channel effects

% Compute error rate for different values of SNR.
SNR = 0:2:20; % Range of SNR values, in dB.
numSNR = length(SNR);
BER = zeros(1, numSNR);
for n = 1:numSNR
   rxSig = awgn(fadedSig,SNR(n));   % Add Gaussian noise
   rx = demodulate(hDemod, rxSig);  % Demodulate
   reset(hDemod);
   % Compute error rate.
   [nErrors, BER(n)] = biterr(tx,rx);
end

% Compute theoretical performance results, for comparison.
BERtheory = berfading(SNR,'dpsk',M,1);

% Plot BER results.
semilogy(SNR,BERtheory,'b-',SNR,BER,'r*');
legend('Theoretical BER','Empirical BER');
xlabel('SNR (dB)'); ylabel('BER');
title('Binary DPSK over Rayleigh Fading Channel');